package com.lblin.tio.client;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import org.tio.client.AioClient;
import org.tio.client.ClientChannelContext;
import org.tio.client.ClientGroupContext;
import org.tio.client.ReconnConf;
import org.tio.client.intf.ClientAioHandler;
import org.tio.client.intf.ClientAioListener;
import org.tio.core.Aio;
import org.tio.core.ChannelContext;
import org.tio.core.Node;

import com.lblin.tio.packets.HelloPacket;

public class HelloClientStarter {
	//服务器节点
	public static Node serverNode = new Node("127.0.0.1", 6789);

	//handler, 包括编码、解码、消息处理
	public static ClientAioHandler aioClientHandler = new HelloClientAioHandler();

	//事件监听器，可以为null，但建议自己实现该接口，可以参考showcase了解些接口
	public static ClientAioListener aioListener = null;

	//断链后自动连接的，不想自动连接请设为null
	private static ReconnConf reconnConf = new ReconnConf(5000L);

	//一组连接共用的上下文对象
	public static ClientGroupContext clientGroupContext = new ClientGroupContext(aioClientHandler, aioListener, reconnConf);

	public static AioClient aioClient = null;
	public static ClientChannelContext clientChannelContext = null;
		
	public static int heartbeatTimeout = 0;

	/**
	 * 启动程序入口
	 */
	public static void main(String[] args) throws Exception {
		clientGroupContext.setHeartbeatTimeout(heartbeatTimeout);
		aioClient = new AioClient(clientGroupContext);
		clientChannelContext = aioClient.connect(serverNode);
		//连上后，发条消息玩玩
		//send("client is start!",null);
	}

	public static String send(String content,String userId) throws Exception {
		HelloPacket packet = new HelloPacket();
		packet.setBody(content.getBytes(HelloPacket.CHARSET));
		if(userId!=null){
			Aio.bindUser(clientChannelContext, userId);
		}
		packet.setSynSeq(packet.gainSynSeq());
		//System.out.println("发送的消息标志为："+packet.getSynSeq());
		//Aio.send(clientChannelContext, packet);
		String result = ((HelloClientAioHandler)clientChannelContext.getGroupContext().getAioHandler()).handlerResponse(Aio.synSend(clientChannelContext, packet, 3000000), clientChannelContext);
		return result;
		
	}
	
}